package com.marketing.tenant.service;

import com.marketing.tenant.entity.TenantUsage;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 租户使用统计服务接口
 */
public interface TenantUsageService {

    /**
     * 获取租户指定日期的使用统计
     * @param tenantId 租户ID
     * @param statDate 统计日期
     * @return 使用统计
     */
    TenantUsage getTenantUsage(Long tenantId, LocalDate statDate);

    /**
     * 获取租户指定时间范围的使用统计
     * @param tenantId 租户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 使用统计列表
     */
    List<TenantUsage> getTenantUsageByDateRange(Long tenantId, LocalDate startDate, LocalDate endDate);

    /**
     * 获取租户最近N天的使用统计
     * @param tenantId 租户ID
     * @param days 天数
     * @return 使用统计列表
     */
    List<TenantUsage> getRecentTenantUsage(Long tenantId, Integer days);

    /**
     * 获取租户使用统计摘要
     * @param tenantId 租户ID
     * @param days 统计天数
     * @return 统计摘要
     */
    Map<String, Object> getTenantUsageSummary(Long tenantId, Integer days);

    /**
     * 记录API调用
     * @param tenantId 租户ID
     * @param count 调用次数，默认为1
     * @return 是否成功
     */
    boolean recordApiCall(Long tenantId, Long count);

    /**
     * 记录API调用（默认次数为1）
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean recordApiCall(Long tenantId);

    /**
     * 记录用户登录
     * @param tenantId 租户ID
     * @param count 登录次数，默认为1
     * @return 是否成功
     */
    boolean recordLogin(Long tenantId, Integer count);

    /**
     * 记录用户登录（默认次数为1）
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean recordLogin(Long tenantId);

    /**
     * 更新存储使用量
     * @param tenantId 租户ID
     * @param storageUsed 存储使用量（字节）
     * @return 是否成功
     */
    boolean updateStorageUsage(Long tenantId, Long storageUsed);

    /**
     * 更新用户统计信息
     * @param tenantId 租户ID
     * @param userCount 用户总数
     * @param activeUserCount 活跃用户数
     * @return 是否成功
     */
    boolean updateUserStats(Long tenantId, Integer userCount, Integer activeUserCount);

    /**
     * 初始化今日使用统计记录
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean initTodayUsage(Long tenantId);

    /**
     * 获取今日使用统计，如果不存在则创建
     * @param tenantId 租户ID
     * @return 使用统计
     */
    TenantUsage getTodayUsageOrCreate(Long tenantId);

    /**
     * 批量更新租户使用统计
     * @param usageList 使用统计列表
     * @return 是否成功
     */
    boolean batchUpdateUsage(List<TenantUsage> usageList);

    /**
     * 获取系统级别的使用统计报告
     * @param statDate 统计日期
     * @return 系统统计报告
     */
    Map<String, Object> getSystemUsageReport(LocalDate statDate);

    /**
     * 定期清理过期的使用统计数据
     * @param beforeDate 清理此日期之前的数据
     * @return 清理的记录数
     */
    int cleanupUsageData(LocalDate beforeDate);
}